/** ***********************************************************************************
* @file         rtc_task.h
* @brief        系统RTC管理任务 头文件
* @details      主要用来管理系统RTC时钟，以及数据接口
* @author       杨小珛
* @date         2021/01/05
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef RTC_TASK_H
#define RTC_TASK_H

#include "os_app.h"

#define GP_LOCAL    0   /* 本地时区 */
#define GN_LOCAL    8   /* 本地时区 */

//时间结构体--------------------------------------------------------------------
typedef struct
{
    uint16_t year;    //年
    uint8_t month;   //月
    uint8_t day;     //天
    uint8_t hour;    //小时
    uint8_t minute;  //分钟
    uint8_t second;  //秒
} rtc_struct;

/**
 *****************************************************************************
 ** RTC的数据类型枚举类型
 *****************************************************************************/
typedef enum en_sys_rtc_type
{
    RTC_TIM_TIMESTAMP = 0x00,   // 时间模式: 时间戳
    RTC_TIM_CAL_INT ,       // 时间格式: 整型日历时钟
    RTC_TIM_CAL_BCD ,       // 时间格式: BCD日历时钟
    RTC_TIM_STRING ,            // 时间格式: 字符串YYYY-MM-DD HH:MM:SS
    RTC_TIM_ASCII ,             // 时间格式: ASCII字符串YYYYMMDDHHMMSS
    RTC_TIM_DEFAULT,            //未定义
} en_sys_rtc_type_t;

/** ****************************************************************************
* @remarks       void rtc_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建RTC数据处理任务
* @param[in]     uxPriority 任务的优先级
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void rtc_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       void rtc_bcd_to_int( RTC_Struct *Time )
* @brief         将BCD码格式的RTC数据转变为int型
* @param[in]     *rtc 输入RTC时间数据地址
* @param[out]    *rtc 输出RTC时间数据地址
* @return        无
* @attention     无
*******************************************************************************/
extern void rtc_bcd_to_int( rtc_struct *rtc );

/** ****************************************************************************
* @remarks       void rtc_int_to_bcd( rtc_struct *rtc )
* @brief         将int型RTC数据转变为BCD码格式
* @param[in]     *rtc 输入RTC时间数据地址
* @param[out]    *rtc 输出RTC时间数据地址
* @return        无
* @attention     无
*******************************************************************************/
extern void rtc_int_to_bcd( rtc_struct *rtc );

/** ****************************************************************************
* @remarks       void rtc_utc_to_local( rtc_struct* ptm, char zone )
* @brief         GPS时间转换为北京时间
* @param[in]     * ptm RTC时间，年，月，日，时，分,秒
* @param[in]     zone 时区小时偏移
* @param[out]    无
* @return        无
* @attention     GPS时间 + 8 小时 = 北京时间
*******************************************************************************/
extern void rtc_utc_to_local( rtc_struct* ptm, char zone );

/** ****************************************************************************
* @remarks       uint32_t rtc_sys_get( en_sys_rtc_type_t time_mode, void* pv )
* @brief         获取系统时间
* @param[in]     time_mode 时间模式
* @param[out]    * pv RTC数据的指针 不固定数据格式
* @return        获取系统时钟的长度
* @attention     函数为半可重入函数,
*******************************************************************************/
extern uint32_t rtc_sys_get( en_sys_rtc_type_t time_mode, void* pv );

/** ****************************************************************************
* @remarks       uint32_t rtc_sys_set( en_sys_rtc_type_t time_mode, void* pv )
* @brief         设置系统时间
* @param[in]     time_mode 时间模式
* @param[in]     * pv RTC数据的指针 不固定数据格式
* @return        pdPASS 设置时间成功，pdFAIL 设置时间失败
* @attention     函数为半可重入函数
*******************************************************************************/
extern uint32_t rtc_sys_set( en_sys_rtc_type_t time_mode, void* pv );

#endif

